/**
 * 模运算（取余）
 * 令 S = 1! + 2! + 3! + ... + 202320232023!,求 S 的末尾 9 位数字。
 * 模运算的独特之处在于它可以将无限大的数映射到一个有限的范围内（0 到 n - 1）（模数 n）
 */
public class 模运算 {
    public static void main(String[] args) {
        // 存储阶乘结果
        long ans = 0;
        // 存储单次阶乘结果
        long sum = 1;
        for (long i = 1; i <= 15; i++){
            // 阶乘
            sum = sum * i;
            System.out.println("每次阶乘的结果：" + sum);
            // 对结果取模（取末尾9位数）
            // 该步骤是避免 sum 溢出，当 sum > 10 的 9 次方时，ans 无论再怎么加，最后 9 位依然不变
            // 当 i <= 15 ，对 sum 取模 10 之后即可观测出 sum 的变化
            sum %= (long) 1e2;
            // 阶乘和
            ans += sum;
            // 当阶乘结果超出 int 数据类型范围时，将无法存储，溢出后符号位翻转，结果变为负数。
            System.out.println("每次的阶乘取模后的结果：" + sum);
        }
        // 只需要末尾 9 位数
        ans %= 1000000000L;
        System.out.println("阶乘和：" + ans);
    }
}
